package java6681.lesson09;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;

/*
F:\JavaFX\Java6681\SceneBuilder-8.5.0.exe
E:\ChromeDownloads\SceneBuilder-8.5.0.exe
*/
public class CopyFile6681 {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入要拷贝的源文件名：");
        String source = input.nextLine();
        System.out.print("请输入目标文件名：");
        String target = input.nextLine();
        //调用checkFile6681()方法检查两个文件名是否可用
        if (checkFile6681(source,target)){
            // 调用System.currentTimeMillis()记下开始时间-->beginTime
            long beginTime = System.currentTimeMillis();

            //如果两个文件名可用，调用copy6681()方法完成文件拷贝，并返回文件的字节数
            //输出拷贝文件的字节数和用时
            System.out.print("拷贝" + copy6681(source, target) + "字节，");

            //调用System.currentTimeMillis()得到当前时间，计算拷贝文件所用的时长-->end
            long end = System.currentTimeMillis();

            System.out.println("用时：" + (end - beginTime) + "毫秒");
        }
    }

    private static boolean checkFile6681(String sourceName, String targetName) throws IOException {
        boolean flag = true;
        //确保源文件已经存在
        File sourcefile = new File(sourceName);
        if (!sourcefile.exists()){
            flag = false;
            throw new RuntimeException("源文件不存在");
        }
        //调用File的getParentFile()，得到目标文件名所包含的路径
        //判断目标路径是否已经存在，如果不存在，创建
        File file = new File(targetName);
        if (!file.exists()) {
            File parent = file.getParentFile();
            if (parent != null && !parent.exists()) {
                if (!parent.mkdirs()) {
                    flag = false;
                    throw new IOException("不能创建目录" + parent);
                }
            }
            file.createNewFile();
        } else {
            flag = false;
            throw new IOException("文件已存在");
        }
        return flag;
    }

    private static long copy6681(String sourceName, String targetName) {
        // 定义一个字节数组，作为缓冲区-->buff
        byte[] buff = new byte[1024];
        int len = 0;
        int size = 0;

        //针对源文件，创建带缓冲的输入流
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceName))) {
            //针对目标文件，创建带缓冲的输出流
            try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetName));) {
                //循环执行下列步骤，直到文件结束
                //1）从输入流中读取数据存入buff
                //2）再把buff中的内容写入到输出流
                //3）累加读到的字节数-->size
                while ((len = bis.read(buff)) != -1) {
                    bos.write(buff, 0, len);
                    size += len;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //返回字节数
        return size;
    }
}